#include <stdio.h>
#include <stdlib.h>
#include "kernel.h"
// oslib
#include "os.h"
//
#include "proto.h"
#include "instrument.h"
#include "midi.h"
#include "midisupp.h"

// this source file handles the interface to the MIDISupport module


static int driverno;
static int installed = 0;
static _kernel_swi_regs r;

os_error *midisupp_driver_info(_kernel_swi_regs *r, void *private);
os_error *midisupp_driver_init(_kernel_swi_regs *r, void *private);
os_error *midisupp_driver_rx(_kernel_swi_regs *r, void *private);
os_error *midisupp_driver_info_code(_kernel_swi_regs *r, void *private);
os_error *midisupp_driver_init_code(_kernel_swi_regs *r, void *private);
os_error *midisupp_driver_rx_code(_kernel_swi_regs *r, void *private);


int midisupport_init(void *private) {

  r.r[0] = MIDISUPPORT_CAN_RX;
  r.r[1] = (int)midisupp_driver_info;
  r.r[2] = (int)midisupp_driver_init;
  r.r[3] = (int)midisupp_driver_rx;
  r.r[4] = (int)private;
  if (_kernel_swi(MIDISupport_InstallDriver, &r, &r))  return 1;

  installed = 1;
  driverno = r.r[0];
  return 0;
}


int midisupport_kill(void *private) {

  if (installed) {
    r.r[1] = driverno;
    _kernel_swi(MIDISupport_RemoveDriver, &r, &r);
    installed = 0;
  }

  return 0;
}

// ------------------------------------------------------------
static char *driver_name = "HBP10GM";
static char *driver_date = "25 Sep 2000";

os_error *midisupp_driver_info_code(_kernel_swi_regs *r, void *private) {

  r->r[0] = (int)driver_name;            // name
  r->r[1] = 1;                           // version
  r->r[2] = (int)driver_date;            // driver date

  return NULL;
}


os_error *midisupp_driver_init_code(_kernel_swi_regs *r, void *private) {

  return NULL;
}


os_error *midisupp_driver_rx_code(_kernel_swi_regs *r, void *private) {

  unsigned char b;
  int n;

  b = r->r[0] & 0xff;
  midi_rx_bytes(NULL, &b, 1, &n);

  return NULL;
}
